import axios, { AxiosRequestConfig } from 'axios';
import { message } from 'antd';

/**
 * 基础配置
 */
const baseConfig = {
    // baseURL: '',
    baseURL: 'https://apitest.awarelife.cn', // 不使用 baseURL，直接使用完整路径
    timeout: parseInt(import.meta.env.VITE_APP_TIMEOUT) || 10000,
    headers: {
        'Content-Type': 'application/json'
    }
};

/**
 * 创建axios实例
 */
const service = axios.create(baseConfig);

/**
 * 请求拦截器
 */
service.interceptors.request.use(
    (config) => {
        // 添加 token（如果有）
        const token = localStorage.getItem('token');
        if (token && config.headers) {
            config.headers['jz-x-token'] = token;
        }
        return config;
    },
    (error) => {
        console.error('Request error:', error);
        return Promise.reject(error);
    }
);

/**
 * 响应拦截器
 */
service.interceptors.response.use(
    (response) => {
        const { data } = response;
        console.log('API响应:', data);
        
        // 统一处理响应状态码
        if (data.code === 1 || data.code === 200) {
            return data.data || data; // 返回完整响应数据，包括code和msg
        } else if (data.code === -1) {
            // 未登录或 token 过期，跳转到登录页
            localStorage.removeItem('token');
            localStorage.removeItem('menuData');
            localStorage.removeItem('userinfo');
            window.location.href = '/login';
            return Promise.reject(new Error('未登录'));
        } else if (data.code === -101) {
            // 未注册，跳转到登录页
            localStorage.removeItem('token');
            localStorage.removeItem('menuData');
            localStorage.removeItem('userinfo');
            window.location.href = '/login';
            return Promise.reject(new Error('未注册'));
        } else {
            // 其他错误，显示错误信息
            console.error('API错误:', data);
            message.error(data.msg || '请求失败');
            return Promise.reject(new Error(data.msg || '请求失败'));
        }
    },
    (error) => {
        // 网络错误处理
        console.error('网络请求错误:', error);
        message.error('网络连接失败');
        return Promise.reject(error);
    }
);

/**
 * 封装请求方法
 * @param options 请求配置
 * @returns Promise
 */
export const request = <T = any>(options: AxiosRequestConfig): Promise<T> => {
    // 直接使用 axios 实例，让 axios 自动处理 baseURL 拼接
    return new Promise((resolve, reject) => {
        service(options)
            .then((response) => {
                resolve(response as T);
            })
            .catch((error) => {
                reject(error);
            });
    });
};

/**
 * GET请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns Promise
 */
export const get = <T = any>(url: string, params?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'GET',
        params
    });
};

/**
 * POST请求
 * @param url 请求地址
 * @param data 请求数据
 * @returns Promise
 */
export const post = <T = any>(url: string, data?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'POST',
        data
    });
};

/**
 * PUT请求
 * @param url 请求地址
 * @param data 请求数据
 * @returns Promise
 */
export const put = <T = any>(url: string, data?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'PUT',
        data
    });
};

/**
 * DELETE请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns Promise
 */
export const del = <T = any>(url: string, params?: any): Promise<T> => {
    return request<T>({
        url,
        method: 'DELETE',
        params
    });
};

export default request; 